﻿#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

//int main()
//{
//	int n = 0;
//	char ch = 0;
//	/*while (ch = getchar() != 'a')
//	{
//		n++;
//	}*/
//
//	for (ch = getchar();ch != 'a'; n++)
//		;
//
//	printf("%d\n", n);
//	return 0;
//}


//int main()
//{
//	int m, n;
//	printf("Enter m,n;");
//	scanf("%d%d", &m, &n);
//	while (m != n) //1
//	{
//		while (m > n) m = m - n; //2
//
//
//		while (n > m) n = n - m; //3
//	} 
//		printf("m=%d\n", m);
//	return 0;
//	
//}


//int main()
//{
//	char c;
//	int v0 = 0, v1 = 0, v2 = 0;
//
//		do
//		{
//			switch (c = getchar())
//			{
//			case'a':case'A':
//			case'e':case'E':
//			case'i':case'I':
//			case'o':case'O':
//			case'u':case'U':v1 += 1;
//			default:v0 += 1; v2 += 1;
//			}
//		} while (c != '\n');
//		printf("v0=%d,v1=%d,v2=%d\n", v0, v1, v2);
//		return 0;
//}


//int main()
//{
//
//
//	int a[] = { 4, 0, 2, 3, 1 }, i, j, t;
//	for (i = 1; i < 5; i++)
//	{
//		t = a[i];
//		j = i - 1;
//		while (j >= 0 && t < a[j])
//		{
//			a[j + 1] = a[j];
//			--j;
//		} a
//			[j + 1] = t;
//	}
//
//	for (i = 0; i < 5; i++)
//	{
//		printf("%d ", a[i]);
//	}
//	return 0;
//}


/*
1、集合 s 包含从 1 到 n 的整数。
不幸的是，因为数据错误，导致集合里面某一个数字复制了成了集合里面的另外一个数字的值，
导致集合丢失了一个数字并且 有一个数字重复 。
给定一个数组 nums 代表了集合 S 发生错误后的结果
*/

/*
思路：
如果丢失的数字大于1且小于n，则一定存在相邻的两个元素的差等于2，这两个元素之间的值即为丢失的数字；
如果丢失的数字是1或n，则需要另外判断。

当丢失的数字小于n 时，通过计算当前元素与上一个元素的差，即可得到丢失的数字；
如果nnums[n−1] != n，则丢失的数字是n
为了防止丢失的数可能为1，所以cur从0开始
*/

int cmp(int* x, int* y)
{
    return (*x - *y);

}

int* findErrorNums(int* nums, int numsSize, int* returnSize) {
    int i = 0;
    int* errorNumbers = (int*)malloc(sizeof(int) * 2);
    *returnSize = 2;
    qsort(nums, numsSize, sizeof(int), cmp);//将数组升序成有序数组
    int cur = 0;
    int next = 0;

    for (i = 0; i < numsSize; i++)
    {
        next = nums[i];
        if (cur == next)
        {
            errorNumbers[0] = cur;
        }
        else if (next - cur > 1)
        {
            errorNumbers[1] = cur + 1;
        }
        cur = next;
    }

    if (nums[numsSize - 1] != numsSize)
    {
        errorNumbers[1] = numsSize;
    }

    return errorNumbers;
}




/*
小明同学最近开发了一个网站，在用户注册账户的时候，需要设置账户的密码，为了加强账户的安全性，小明对密码强度有一定要求：

1. 密码只能由大写字母，小写字母，数字构成；
2. 密码不能以数字开头；
3. 密码中至少出现大写字母，小写字母和数字这三种字符类型中的两种；
4. 密码长度至少为8
现在小明受到了n个密码，他想请你写程序判断这些密码中哪些是合适的，哪些是不合法的。

*/
int main()
{
    int n = 0;
    scanf("%d", &n);
    char str[100] = { 0 };
    int i = 0;
    for (i = 0; i < n; i++)
    {
        scanf("%s", &str);
        //判断一组密码是否规范
        int num = 0;//数字计数器 
        int low = 0;//小写字母计数器
        int upp = 0;//大写字母计数器
        int j = 0;
        int len = strlen(str);
        for (j = 0; j < len; j++)
        {
            if (48 <= str[j] && str[j] <= 57)
                num++;
            if (97 <= str[j] && str[j] <= 122)
                low++;
            if (65 <= str[j] && str[j] <= 90)
                upp++;
        }
        if (((65 <= str[0] && str[0] <= 90) || (97 <= str[0] && str[0] <= 122)) && (len >= 8) && ((num != 0 && low != 0) || (num != 0 && upp != 0) || (low != 0 && upp != 0)))
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}
